package com.dragon.common.modules.uaa.web.api;

import com.chris.dev.base.libs.v1.http.params.NoneParam;
import com.chris.dev.base.libs.v1.http.results.ValueResult;
import com.dragon.common.modules.uaa.web.models.params.CompleteAccountParam;
import com.dragon.common.modules.uaa.web.models.params.UpdateAccountRoleParam;
import com.dragon.common.modules.uaa.web.models.params.UpdatePasswordByEmailVerifyCodeParam;
import com.dragon.common.modules.uaa.web.models.params.UpdatePasswordByPhoneVerifyCodeParam;
import com.dragon.common.modules.uaa.web.models.results.LoginResult;
import com.dragon.common.modules.uaa.web.models.results.UserInfoResult;
import com.dragon.common.spring.annotations.ResponseBodyPack;
import com.dragon.common.spring.openapi.AccessToken;
import com.dragon.common.spring.openapi.ApiGroup;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;

/**
 * @author Chris Chan
 * Create On 2025/7/29 下午7:08
 * Use for: 账号接口
 * Explain:
 * 需要授权
 */
@AccessToken
@ResponseBodyPack
@ApiGroup("uaa")
@Tag(name = "账号(需要认证)", description = "账号相关接口，需要具有访问权限")
public interface AccountApi {
    /**
     * 修改密码
     * 通过手机号验证码修改密码
     *
     * @param param 修改密码参数
     * @return 无
     */
    @Operation(summary = "修改密码(手机号+验证码)", description = "通过手机号验证码修改密码")
    @PostMapping("updatePasswordByPhoneVerifyCode")
    ValueResult<Boolean> updatePasswordByPhoneVerifyCode(UpdatePasswordByPhoneVerifyCodeParam param);

    /**
     * 修改密码
     * 通过邮箱验证码修改密码
     *
     * @param param 修改密码参数
     * @return 是否修改成功
     */
    @Operation(summary = "修改密码(邮箱+验证码)", description = "通过邮箱验证码修改密码")
    @PostMapping("updatePasswordByEmailVerifyCode")
    ValueResult<Boolean> updatePasswordByEmailVerifyCode(UpdatePasswordByEmailVerifyCodeParam param);

    /**
     * 通过刷新令牌来重新获取登录结果
     * 通过刷新令牌身份来重新获取登录结果
     * 需授权
     *
     * @param param         刷新令牌参数
     * @param authorization 刷新令牌，格式：Bearer 刷新令牌,Header参数
     * @return 登录结果
     */
    @Operation(summary = "刷新登录凭证", description = "通过刷新令牌来重新获取登录结果，无需授权")
    @PostMapping("refreshLoginResult")
    LoginResult refreshLoginResult(NoneParam param, String authorization);

    /**
     * 退出登录
     *
     * @param param 无参数
     * @return 是否退出成功
     */
    @Operation(summary = "退出登录", description = "退出登录")
    @PostMapping("logout")
    ValueResult<Boolean> logout(NoneParam param);

    /**
     * 完善账号数据
     *
     * @param param 完成账号参数
     * @return 是否完成成功
     */
    @Operation(summary = "完善账号", description = "完善账号数据")
    @PostMapping("completeAccount")
    ValueResult<Boolean> completeAccount(CompleteAccountParam param);

    /**
     * 更改账号角色
     *
     * @param param 更改账号角色参数
     * @return 是否更改成功
     */
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @Operation(summary = "更改账号角色", description = "更改账号角色")
    @PostMapping("updateAccountRole")
    ValueResult<Boolean> updateAccountRole(UpdateAccountRoleParam param);

    /**
     * 获取用户信息
     *
     * @return 用户信息
     */
    @Operation(summary = "获取用户信息", description = "获取当前登录用户的信息")
    @PostMapping("getUserInfo")
    UserInfoResult getUserInfo();
}
